package com.thinkit.bigdata.web.service.impl.sec;

import com.thinkit.bigdata.web.dao.sec.PasswordCheckMapper;
import com.thinkit.bigdata.web.dao.sec.SysUserMapper;
import com.thinkit.bigdata.web.dao.sys.SysConfigMapper;
import com.thinkit.bigdata.web.model.result.Constants;
import com.thinkit.bigdata.web.model.result.HtmlResult;
import com.thinkit.bigdata.web.model.sec.User;
import com.thinkit.bigdata.web.model.sec.UserPassHistory;
import com.thinkit.bigdata.web.model.sys.SysConfig;
import com.thinkit.bigdata.web.service.sec.PasswordCheckService;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.Date;
import java.util.List;

/**
 * Created by lihongli on 2019/1/28
 */
@Service
public class PasswordCheckServiceImpl implements PasswordCheckService {

    @Resource
    private PasswordCheckMapper passwordCheckMapper;

    @Resource
    private SysConfigMapper sysConfigMapper;

    @Resource
    private SysUserMapper sysUserMapper;

    @Override
    public HtmlResult updatePassword(User user) {
        // 先查询多少次内不能重复
        int times = selectMaxRepeatTimes();
        // 在更新用户密码前先校验用户密码是否与之前设置的相同
        List<UserPassHistory> userPassHistoryList = passwordCheckMapper.selectUserPassHistory(user.getId());
        // 检查下查询为空时数据  查询出来的历史密码信息 如果不为空 则与当前密码进行对比 看是否有相同的
        if (!userPassHistoryList.isEmpty()) {
            boolean isPasswordExistInHistory = false;
            for (UserPassHistory userPassHistory : userPassHistoryList) {
                // 如果有相同的
                if (user.getPassword().equals(userPassHistory.getPassword())) {
                    isPasswordExistInHistory = true;
                }
            }
            if (isPasswordExistInHistory) {
                return HtmlResult.failure("密码不能与最近" + times + "次内设置的相同");
            }
        }
        // 校验如果通过了 则修改密码 此时会更新密码设定时间
        sysUserMapper.updateByPrimaryKeySelective(user);
        // 删除多余的历史密码
        int count = userPassHistoryList.size();
        if (count + 1 > times) {
            // 如果count加1后大于了times 则删除最早设置的密码
            passwordCheckMapper.deleteByPrimaryKey(userPassHistoryList.get(0).getId());
        }
        // 插入新的历史密码信息
        UserPassHistory userPassHistory = new UserPassHistory();
        userPassHistory.setPassword(user.getPassword());
        userPassHistory.setUserid(user.getId());
        userPassHistory.setCreatetime(new Date());
        // 调用这个方法的页面为强制修改密码 忘记密码 都是当前用户操作 所有创建人id与用户id一样
        userPassHistory.setCreateuser(user.getId());
        passwordCheckMapper.insertUserPassHistory(userPassHistory);
        return HtmlResult.success("密码修改成功");
    }

    // 查询密码多少次内不能重复
    private int selectMaxRepeatTimes() {
        int times = 5;
        // 查询修改密码多少次内不能重复
        try {
            SysConfig config = sysConfigMapper.selectByPrimaryKey(Constants.PSW_NOT_REPEAT_TIMES);
            // 对配置的值进行判断处理
            times = Integer.valueOf(config.getValue().trim());
        } catch (Exception e) {
            // 非数字格式转换报错 不处理 直接使用默认值
        }
        return times;
    }
}
